<?php

class DatossapientiaController extends Controller
{
	protected $rosetta = array();
	protected $conteo = array();

	/**
	 * @return array action filters
	 */
	public function filters()
	{
		return array(
			'rights', // perform access control for CRUD operations
		);
	}

	/**
	 * Specifies the access control rules.
	 * This method is used by the 'accessControl' filter.
	 * @return array access control rules
	 */
	public function accessRules()
	{
		return array(
			array('allow',  // allow all users to perform 'index' and 'view' actions
				'actions'=>array('index','view'),
				'users'=>array('*'),
			),
			array('allow', // allow authenticated user to perform 'create' and 'update' actions
				'actions'=>array('create','update'),
				'users'=>array('@'),
			),
			array('allow', // allow admin user to perform 'admin' and 'delete' actions
				'actions'=>array('admin','delete'),
				'users'=>array('admin'),
			),
			array('deny',  // deny all users
				'users'=>array('*'),
			),
		);
	}

	public function actionIndex()
	{

		$rosetta = &$this->rosetta;

		$urlSapientia = Yii::app()->params['sapientia'];
		$content = file_get_contents($urlSapientia);
		$datos = CJSON::decode($content);

		$periodoLectivo = Periodoslectivos::model()->findByAttributes(
			array('periodo_actual'=>true)
			);

		$this->conteo['profesores']['Profesores en SAPIENTIA'] = 0;
		$this->conteo['profesores']['Profesores encontrados'] = 0;
		$this->conteo['profesores']['Profesores creados'] = 0;
		$this->conteo['materias']['Materias en SAPIENTIA'] = 0;
		$this->conteo['materias']['Materias encontradas'] = 0;
		$this->conteo['materias']['Materias creadas'] = 0;
		if ($periodoLectivo != null) {
			$this->conteo['cursos']['Cursos encontrados'] = 0;
			$this->conteo['cursos']['Cursos creados'] = 0;
			$this->conteo['categorías']['Categorías en SAPIENTIA'] = 0;
			$this->conteo['categorías']['Categorías encontradas'] = 0;
			$this->conteo['categorías']['Categorías creadas'] = 0;
			$this->conteo['horarios']['Horarios en SAPIENTIA'] = 0;
			$this->conteo['horarios']['Horarios encontrados'] = 0;
			$this->conteo['horarios']['Horarios creados'] = 0;
		}

		// Buscar usuarios y asociarlos con ID's.
		foreach ($datos['profesor'] as $key => $value) {
			$this->conteo['profesores']['Profesores en SAPIENTIA']++;
			$user_id = $this->obtenerProfesor($value);
			$rosetta['profesor'][$key] = $user_id;
		}
		// Buscar materias y asociarlas con ID's. Buscar además cursos.
		foreach ($datos['materia'] as $key => $value) {
			$this->conteo['materias']['Materias en SAPIENTIA']++;
			$materia_id = $this->obtenerMateria($value,$datos['carrera'][$value['carrera']]);
			$rosetta['materia'][$key] = $materia_id;
			if ($periodoLectivo != null) {
				$curso_id = $this->obtenerCurso($materia_id);
				$rosetta['curso'][$key] = $curso_id;
			}
		}
		if ($periodoLectivo != null)
		{
			// Buscar categorías y asociarlas con ID's.
			foreach ($datos['categoria'] as $key => $value) {
				$this->conteo['categorías']['Categorías en SAPIENTIA']++;
				$categoria_id = $this->obtenerCategoria($value);
				$rosetta['categoria'][$key] = $categoria_id;
			}
			// Buscar horarios y asociarlos con ID's.
			foreach ($datos['horario'] as $key => $value) {
				foreach ($value['clases'] as $keyHorario => $valueHorario) {
					$this->conteo['horarios']['Horarios en SAPIENTIA']++;
					$horario_id = $this->obtenerHorario($valueHorario, $value['materia'], $value['profesor']);
					$rosetta['horario'][$keyHorario] = $horario_id;
				}
			}
		}

		$this->render('index');
	}

	protected function obtenerProfesor(array $profesor)
	{
		$user_id = Profesores::model()->findByAttributes(
			array('codigo'=>$profesor['codigo'])
			);
		if ($user_id != null)
		{
			$user_id = $user_id['id'];
			$this->conteo['profesores']['Profesores encontrados']++;
		}
		else
			$user_id = $this->crearProfesor($profesor);
		return $user_id;
	}
	protected function crearProfesor(array $profesor)
	{
		$user_id = Profile::model()->findByAttributes(
			array('ci'=>$profesor['ci'])
			);
		if ($user_id != null)
			$user_id = $user_id['user_id'];
		else
		{
			// Crear nuevo usuario, porque no se encontró.
			$userModel = new User;
			$profileModel = new Profile;
			$profesoresModel = new Profesores;
			$userModel->username = $this->generarUsername($profesor['nombres'].$profesor['apellidos']);
			$userModel->password = 'prueba';
			$userModel->activkey=UserModule::encrypting(microtime().$userModel->password);
			$userModel->email = $profesor['email'];
			$profileModel->firstname = $profesor['nombres'];
			$profileModel->lastname = $profesor['apellidos'];
			$profileModel->ci = $profesor['ci'];
			$profesoresModel->codigo = $profesor['codigo'];
			// Para validar.
			$profileModel->user_id = 0;
			$profesoresModel->id = 0;
			if ($userModel->validate() && $profileModel->validate() && $profesoresModel->validate())
			{
				$userModel->password=UserModule::encrypting($userModel->password);
				if ($userModel->save()) {
					$profileModel->user_id = $userModel->id;
					$profesoresModel->id = $userModel->id;
					$profileModel->save();
					$profesoresModel->save();
					$user_id = $userModel->id;
					$this->conteo['profesores']['Profesores creados']++;
				}
			}
		}
		return $user_id;
	}
	protected function generarUsername($nombre)
	{
		$accents = '/&([A-Za-z]{1,2})(grave|acute|circ|cedil|uml|lig);/';
		$string_encoded = htmlentities($nombre,ENT_NOQUOTES,'UTF-8');
		$nombre = preg_replace($accents,'$1',$string_encoded);
		$nombre = strtolower($nombre);
		$nombre = str_replace(' ', '', $nombre);
		return $nombre;
	}

	protected function obtenerMateria(array $materia, array $carrera)
	{
		$nombreMateria = $materia['nombre'] . ' - ' . $carrera['nombre'];
		$materia_id = Materias::model()->findByAttributes(
			array('nombre'=>$nombreMateria)
			);
		if ($materia_id != null) {
			$materia_id = $materia_id['id_materia'];
			$this->conteo['materias']['Materias encontradas']++;
		}
		else
			$materia_id = $this->crearMateria($nombreMateria);
		return $materia_id;
	}
	protected function crearMateria($nombreMateria)
	{
		$materia_id = null;
		$materiasModel = new Materias;
		$materiasModel->nombre = $nombreMateria;
		if ($materiasModel->save()) {
			$materia_id = $materiasModel->id_materia;
			$this->conteo['materias']['Materias creadas']++;
		}
		return $materia_id;
	}
	protected function obtenerCurso($idMateria)
	{
		$criteria = new CDbCriteria;
		$criteria->with = array('idPeriodo');
		$criteria->addColumnCondition(array(
			'id_materia'=>$idMateria,
			'"idPeriodo".periodo_actual'=>true,
			));
		$curso_id = Cursos::model()->find($criteria);
		if ($curso_id != null) {
			$curso_id = $curso_id['id_curso'];
			$this->conteo['cursos']['Cursos encontrados']++;
		}
		else
			$curso_id = $this->crearCurso($idMateria);
		return $curso_id;
	}
	protected function crearCurso($idMateria)
	{
		$curso_id = null;
		$periodoLectivo = Periodoslectivos::model()->findByAttributes(
			array('periodo_actual'=>true)
			);
		if ($periodoLectivo != null)
		{
			$cursosModel = new Cursos;
			$cursosModel->id_periodo = $periodoLectivo['id_periodo'];
			$cursosModel->id_materia = $idMateria;
			$cursosModel->seccion = 'A';
			if ($cursosModel->save()) {
				$curso_id = $cursosModel->id_curso;
				$this->conteo['cursos']['Cursos creados']++;
			}
		}
		return $curso_id;
	}

	protected function obtenerCategoria(array $categoria)
	{
		$rosetta = &$this->rosetta;
		$idProfesor = $rosetta['profesor'][$categoria['profesor']];
		$idMateria = $rosetta['materia'][$categoria['materia']];
		$criteria = new CDbCriteria;
		$criteria->with = array('idCurso.idMateria');
		$criteria->addColumnCondition(array(
			'id'=>$idProfesor,
			'"idCurso".id_materia'=>$idMateria,
			));
		$categoria_id = Categorias::model()->find($criteria);
		if ($categoria_id != null) {
			$categoria_id = $categoria_id['id_categoria'];
			$this->conteo['categorías']['Categorías encontradas']++;
		}
		else
			$categoria_id = $this->crearCategoria($categoria);
		return $categoria_id;
	}
	protected function crearCategoria(array $categoria)
	{
		$categoria_id = null;
		$rosetta = &$this->rosetta;
		$idProfesor = $rosetta['profesor'][$categoria['profesor']];
		$idMateria = $rosetta['materia'][$categoria['materia']];
		$idCurso = $rosetta['curso'][$categoria['materia']];
		if ($idCurso != null)
		{
			$categoriaModel = new Categorias;
			$categoriaModel->id = $idProfesor;
			$categoriaModel->id_curso = $idCurso;
			$categoriaModel->monto = $categoria['sueldo'];
			$categoriaModel->nombre = Profesores::model()->findByPk($idProfesor)->display . ' - ' . Materias::model()->findByPk($idMateria)->nombre;
			if ($categoriaModel->save()) {
				$categoria_id = $categoriaModel->id_categoria;
				$this->conteo['categorías']['Categorías creadas']++;
			}
		}
		return $categoria_id;
	}

	protected function obtenerHorario(array $horarioClase, $materia, $profesor)
	{
		$rosetta = &$this->rosetta;
		$idProfesor = $rosetta['profesor'][$profesor];
		$idCurso = $rosetta['curso'][$materia];
		$horario_id = Horarios::model()->findByAttributes(array(
			'id_curso'=>$idCurso,
			'dia_semana'=>$horarioClase['dia'],
			'hora_inicio'=>$horarioClase['inicio'],
			'hora_fin'=>$horarioClase['fin'],
			));
		if ($horario_id != null) {
			$horario_id = $horario_id['id_horario'];
			$this->conteo['horarios']['Horarios encontrados']++;
		}
		else
			$horario_id = $this->crearHorario($horarioClase,$idCurso);
		return $horario_id;
	}
	protected function crearHorario(array $horarioClase, $idCurso)
	{
		$horario_id = null;
		$horariosModel = new Horarios;
		$horariosModel->id_curso = $idCurso;
		$horariosModel->dia_semana = $horarioClase['dia'];
		$horariosModel->hora_inicio = $this->generarHora($horarioClase['inicio']);
		$horariosModel->hora_fin = $this->generarHora($horarioClase['fin']);
		$horariosModel->id_aula = $this->obtenerAula($horarioClase['aula']);
		if ($horariosModel->save()) {
			$horario_id = $horariosModel->id_horario;
			$this->conteo['horarios']['Horarios creados']++;
		}
		return $horario_id;
	}
	protected function generarHora($hora)
	{
		return Yii::app()->dateFormatter->format('HH:mm:ss', $hora);
	}

	protected function obtenerAula($nombre)
	{
		$aula_id = Aulas::model()->findByAttributes(
			array('descripcion'=>$nombre)
			);
		if ($aula_id != null)
			$aula_id = $aula_id['id_aula'];
		else
			$aula_id = $this->crearAula($nombre);
		return $aula_id;
	}
	protected function crearAula($nombre)
	{
		$aula_id = null;
		$aulasModel = new Aulas;
		$aulasModel->numero_aula = (int)$nombre;
		$aulasModel->descripcion = $nombre;
		if ($aulasModel->save())
			$aula_id = $aulasModel->id_aula;
		return $aula_id;
	}

	// Uncomment the following methods and override them if needed
	/*
	public function filters()
	{
		// return the filter configuration for this controller, e.g.:
		return array(
			'inlineFilterName',
			array(
				'class'=>'path.to.FilterClass',
				'propertyName'=>'propertyValue',
			),
		);
	}

	public function actions()
	{
		// return external action classes, e.g.:
		return array(
			'action1'=>'path.to.ActionClass',
			'action2'=>array(
				'class'=>'path.to.AnotherActionClass',
				'propertyName'=>'propertyValue',
			),
		);
	}
	*/
}